package org.facyt.vacas.web.controller;

import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.facyt.vacas.services.FormulacionService;
import org.facyt.vacas.utils.ArchivoUtil;
import org.facyt.vacas.utils.ConstantesServices;
import org.facyt.vacas.web.util.ConstantesWeb;
import org.facyt.vacas.web.util.UploadProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestContextHolder;

@Controller
@Scope("session")
public class FormulacionController {

	private static final Log logger = LogFactory.getLog(FormulacionController.class);
	
	@Autowired
	private FormulacionService formulacionService;
	
	public void setFormulacionService(FormulacionService formulacionService) {
		this.formulacionService = formulacionService;
	}

	@RequestMapping(value = "/formulacion.htm")
	public String formulacion(Model model) {
		model.addAttribute("uploadbean", new UploadProperties());
		model.addAttribute("sessionId", RequestContextHolder
				.currentRequestAttributes().getSessionId());

		return ConstantesWeb.FORMULACION;
	}
	
	/**
	 * Metodo que retorna los archivos cargados
	 * @param request 
	 * @param response
	 * @return Retorna los datos del archivo
	 */
	@RequestMapping(value = "/formulario/cargarDatosDesdeArchivo.htm", method=RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})
	public @ResponseBody Map<String, Object> cargarDatosDesdeArchivos(HttpServletRequest request,
			HttpServletResponse response){
		Map<String, Object> resultado = new HashMap<String, Object>();
		FileInputStream file = null;
		String nombreArchivo = (String) request.getSession().getAttribute(ConstantesServices.NOMBRE_ARCHIVO_CARGADO_VIA_WEB);
		try{
		
			file = new FileInputStream(nombreArchivo);
		
		}catch(Exception e){
			logger.error(ConstantesServices.LOG_ERROR, e);
		}
		
		if (file != null)
			resultado = formulacionService.cargarArchivos(file);
		
		return resultado;
	}

	/**
	 * Metodo para cargar el archivo 
	 * @param uploadbean
	 * @param result
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value = "/formulario/upload-file", method = RequestMethod.POST)
	public String uploadcreate(UploadProperties uploadbean,
			BindingResult result, HttpServletRequest request,
			HttpServletResponse response) {

		boolean success = false;

		if (result.hasErrors()) {
			for (ObjectError error : result.getAllErrors()) {
				logger.error("Error in uploading: " + error.getCode() + " - "
						+ error.getDefaultMessage());
			}
			// todo ver esto para agregar i18n
			return "error al subir el archivo";
		}

		String nameOfFile = uploadbean.getFiledata().getOriginalFilename();

		String[] splitName = nameOfFile.split("\\.");

		nameOfFile = splitName[0] + request.getSession().getId()
				+ ConstantesServices.SEPARADOR_NOMBRE_EXTENSION_ARCHIVO
				+ splitName[1];

		// se guarda el archivo temporal
		File file = ArchivoUtil.saveFileIntoTemp(uploadbean.getFiledata()
				.getBytes(), nameOfFile);
		
		request.getSession().setAttribute(ConstantesServices.NOMBRE_ARCHIVO_CARGADO_VIA_WEB,nameOfFile);

		if (success) {
			return "archivo subido correctamente";
		} else {
			return "error al subir el archivo";
		}
	}
}
